import { useState } from 'react'
import { getMediaDomainConfigList } from '@/utils/mediaDomainCache'

// 类型定义
interface CdnFileResult {
  url: string
  isSecond: boolean
}

/**
 * 替换URL中的域名
 * @param urlObj URL对象
 * @param newDomain 新的域名
 * @returns 替换后的URL字符串
 */
function replaceDomain(urlObj: URL, newDomain: string): string {
  urlObj.hostname = newDomain
  return urlObj.toString()
}

export function useCdnFile() {
  const [cdnFile, setCdnFile] = useState<string>('')

  /**
   * 获取CDN文件URL
   * @param url 原始URL
   * @returns 返回CDN文件URL和是否是第二域名
   * - 如果URL匹配firstDomain，则转换为secondDomain
   * - 如果URL匹配secondDomain，则转换为thirdDomain
   * - 如果URL匹配thirdDomain，则返回原始URL
   * - 如果没有匹配，则返回原始URL
   */
  const getCdnFile = async (url: string): Promise<CdnFileResult> => {
    if (!url) {
      return { url, isSecond: false }
    }

    let mediaDomainConfigList = await getMediaDomainConfigList()

    if (!mediaDomainConfigList?.length) {
      return {
        url,
        isSecond: false,
      }
    }

    try {
      const urlObj = new URL(url)
      const hostname = urlObj.hostname

      // 遍历域名配置列表，查找匹配的域名
      for (const config of mediaDomainConfigList) {
        const { firstDomain, secondDomain, thirdDomain } = config

        // 检查当前域名是否匹配firstDomain
        if (hostname === firstDomain) {
          return {
            url: replaceDomain(urlObj, secondDomain),
            isSecond: false,
          }
        }

        // 检查当前域名是否匹配secondDomain
        if (hostname === secondDomain) {
          return {
            url: replaceDomain(urlObj, thirdDomain),
            isSecond: false,
          }
        }

        // 检查当前域名是否匹配thirdDomain
        if (hostname === thirdDomain) {
          return {
            url,
            isSecond: true,
          }
        }
      }

      // 如果没有匹配的域名，返回原始URL
      return {
        url,
        isSecond: false,
      }
    }
    catch (error) {
      // 如果URL解析失败，返回原始URL
      console.error('Invalid URL format:', url, error)
      return {
        url,
        isSecond: false,
      }
    }
  }

  return {
    cdnFile,
    setCdnFile,
    getCdnFile,
  }
}

export default useCdnFile
